package com.example.lcpractice.lc;

import com.example.lcpractice.datastructure.ListNode;

import java.util.ArrayList;
import java.util.List;

/**
 * 461. 汉明距离
 * 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
 * <p>
 * 给你两个整数 x 和 y，计算并返回它们之间的汉明距离。
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：x = 1, y = 4
 * 输出：2
 * 解释：
 * 1   (0 0 0 1)
 * 4   (0 1 0 0)
 * ↑   ↑
 * 上面的箭头指出了对应二进制位不同的位置。
 * <p>
 * 提示：
 * <p>
 * <p>
 * 0 <= x, y <= 2³¹ - 1
 * <p>
 * Related Topics 位运算 👍 644 👎 0
 */
public class Lc461 {


    public static void main(String[] args) {
//        System.out.println(5>>1);
//        System.out.println(4>>1);

    }

    /**
     * 计算 x 和 y 之间的汉明距离，可以先计算 x⊕y，然后统计结果中等于 1 的位数。
     * 难点在于记住，异或符号是 '^'
     * 调用api
     *
     * @param x
     * @param y
     * @return
     */
    public static int hammingDistance(int x, int y) {
        return Integer.bitCount(x ^ y);
    }

    /**
     * 自己写
     *
     * (101)B >> (10)B 2
     * (100)B >> (10)B 2
     * @param x
     * @param y
     * @return
     */
    public static int hammingDistance2(int x, int y) {
        int s = x ^ y, bitCount = 0;
        while (s != 0) {
            //如果末尾为1，1'与'运算保留末尾1为1
            //如果末尾为0，1'与'运算保留末尾0为0
            bitCount = (s & 1)+bitCount;
            //右移一位强行删除末尾
            s = s>>1;
        }
        return bitCount;
    }

}
